#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#ifdef _WIN32
#include <windows.h>
#elif defined(__APPLE__)
#include <CoreFoundation/CoreFoundation.h>
#elif defined(__linux__) || defined(__unix__)
#include <langinfo.h>
#include <locale.h>
#endif

/**
 * 获取系统默认字符编码
 *
 * @return 返回字符编码名称字符串指针，使用完后需要调用free()释放内存
 *         如果无法确定编码，则返回"UTF-8"的副本
 */
char* get_system_encoding() {
    char* encoding = NULL;

#ifdef _WIN32
    /* Windows系统实现 */
    UINT code_page = GetACP();  // 获取活动代码页

    switch (code_page) {
        case 65001: encoding = strdup("UTF-8"); break;
        case 936:   encoding = strdup("GBK"); break;      // 简体中文
        case 950:   encoding = strdup("BIG5"); break;     // 繁体中文
        case 932:   encoding = strdup("SHIFT_JIS"); break; // 日文
        case 949:   encoding = strdup("EUC-KR"); break;   // 韩文
        case 1252:  encoding = strdup("CP1252"); break;   // 西欧
        case 437:   encoding = strdup("IBM437"); break;   // 美国
        case 850:   encoding = strdup("IBM850"); break;   // 多语言拉丁文1
        default: {
            // 对于未知代码页，格式化为"CPxxxx"
            char buffer[16];
            snprintf(buffer, sizeof(buffer), "CP%u", code_page);
            encoding = strdup(buffer);
            break;
        }
    }

#elif defined(__APPLE__)
    /* macOS系统实现 */
    // macOS通常使用UTF-8，但我们可以检查区域设置
    CFStringRef locale = CFLocaleCopyCurrent();
    CFStringRef encoding_cf = (CFStringRef)CFLocaleGetValue(locale, kCFLocaleLanguageCode);

    char buffer[64] = {0};
    if (CFStringGetCString(encoding_cf, buffer, sizeof(buffer), kCFStringEncodingUTF8)) {
        encoding = strdup(buffer);
    } else {
        encoding = strdup("UTF-8");  // 默认回退到UTF-8
    }

    CFRelease(locale);

#elif defined(__linux__) || defined(__unix__)
    /* Linux/Unix系统实现 */
    setlocale(LC_ALL, "");  // 设置locale为环境变量指定的值
    const char* langinfo_encoding = nl_langinfo(CODESET);

    if (langinfo_encoding != NULL && *langinfo_encoding != '\0') {
        encoding = strdup(langinfo_encoding);
    } else {
        encoding = strdup("UTF-8");  // 默认回退到UTF-8
    }

#else
    /* 其他未知系统 */
    encoding = strdup("UTF-8");  // 默认回退到UTF-8
#endif

    // 确保总是返回有效的字符串
    if (encoding == NULL) {
        encoding = strdup("UTF-8");
    }

    return encoding;
}

/* 测试代码 */
int main() {
    char* encoding = get_system_encoding();
    printf("System default encoding: %s\n", encoding);
    free(encoding);
    return 0;
}